#define _CRT_SECURE_NO_WARNINGS
#include "Queue.h"

// 初始化队列
void QueueInit(Queue* q)
{
	assert(q);
	q->_Front = NULL;
	q->_Tail = NULL;
	q->_size = 0;
}


// 队尾入队列
void QueuePush(Queue* q, QListDataType Value)
{
	assert(q);
	QNode* NewNode = (QNode*)malloc(sizeof(QNode));
	if (NewNode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	NewNode->_Next = NULL;
	NewNode->_Value = Value;
	//队头和队尾指向一致时
	if (q->_Front == NULL)
	{
		q->_Front = NewNode;
		q->_Tail = NewNode;
	}
	else
	{
		//链接新节点
		q->_Tail->_Next = NewNode;
		//队尾指向新节点
		q->_Tail = NewNode;
	}
	q->_size++;
}

// 队头出队列
void QueuePop(Queue* q)
{
	assert(q);
	assert(q->_Front && q->_Tail);
	if(q->_Front == q->_Tail)
	{
		free(q->_Front);
		q->_Front = q->_Tail = NULL;
	}
	else
	{
		//保留下一个节点
		QNode* Temp = q->_Front->_Next;
		//释放旧节点
		free(q->_Front);
		//指向新节点
		q->_Front = Temp;
	}
	q->_size--;
}

// 获取队列中有效元素个数
int QueueSize(Queue* q)
{
	return q->_size;
}

// 获取队列头部元素
QListDataType QueueFront(Queue* q)
{
	assert(q && q->_Front);
	return q->_Front->_Value;
}

// 获取队列队尾元素
QListDataType QueueBack(Queue* q)
{
	assert(q && q->_Tail);
	return q->_Tail->_Value;
}



// 检测队列是否为空，如果为空返回非零结果，如果非空返回0 
int QueueEmpty(Queue* q)
{
	return q->_size == 0 ? true : false;
}

// 销毁队列
void QueueDestroy(Queue* q)
{
	QNode* Current = q->_Front;
	while (Current != NULL)
	{
		//保留下一个节点
		QNode* Temp = Current->_Next;
		free(Current);
		Current = Temp;
	}
	q->_Front = NULL;
	q->_Tail = NULL;
	q->_size = 0;

}
